home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 5
/
Gekikoh Dennoh Club Vol. 5 (Japan).7z
/
Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin
/
internet
/
webx
/
webxp040.lzh
/
Source
/
gifl.s
< prev
next >
Wrap
Text File
|
1998-07-11
|
15KB
|
893 lines
* gifl.s
.include DOSCALL.MAC
.include gifl.inc
.xdef _gifdecodemain
* âIâèâWâiâïé╠ main.hasüiâRâüâôâg by Mitsukyüj
.text
.even
a7buf: .ds.l 1
_gifdecodemain:
movem.l d3-d7/a3-a6,-(sp)
move.l a7,a7buf
move.l 40(sp),a5
move.l 44(sp),_srcfile(a5)
bsr get_filesize * âtâ@âCâïâIü[âvâôüCé┬éóé┼é╔âtâ@âCâïâTâCâYĵô╛
bsr gif_header_read * âwâbâ_ë≡É═
tst.l d0
bmi error
bsr read_adr_get * ô╟é▌ì₧é▌üòâüâéâèâZâbâg
tst.l d0
bmi error
bsr gif_decode
move.l a5,d0
move.l a7buf,a7
movem.l (sp)+,d3-d7/a3-a6
rts
error:
NO_MEMORY:
move.l a7buf,a7
ori.l #$80000000,d0
movem.l (sp)+,d3-d7/a3-a6
rts
*-------------------------------------------------------------------------------
* âtâ@âCâïâIü[âvâôüòëµæ£âfü[â^âtâ@âCâïâTâCâYĵô╛
get_filesize:
moveq.l #1,d6
move.w #0,-(sp)
move.l _srcfile(a5),-(sp)
DOS _OPEN
addq.l #6,sp
move.w d0,_file(a5)
bmi error
move.w #2,-(sp)
pea.l 0.w
move.w _file(a5),-(sp)
DOS _SEEK
move.l d0,d1
move.w #0,6(sp)
DOS _SEEK
addq.l #8,sp
move.l d1,_src_fsize(a5)
moveq.l #0,d0
rts
*-------------------------------------------------------------------------------
* ô╟é▌ì₧é▌üòâüâéâèâZâbâg
read_adr_get:
tst.b _gif_hispeed+1(a5) * âCâôâ^ü[âîâXé⌐üH
beq read_adr_get256_normal * êßéñé╠é╚éτ normal é╓
read_adr_get256_interlace:
clr.b _gif_hispeed(a5)
move.w _line(a5),d0
mulu.w _colum(a5),d0
addq.l #1,d0
and.w #$fffe,d0
move.l d0,d1
* âCâôâ^ü[âîâXìéæ¼ôWèJé╠é╜é▀üCÆ╩Åφé╠ö{é╠ë╝æzGRAMé≡ùpê╙
add.l d0,d0
add.l _src_fsize(a5),d0
movem.l d1-d2/a0-a2,-(sp)
move.l d0,-(sp)
move.l d0,_buff_size(a5)
.if 1
move.w #2,-(sp)
DOS _MALLOC2
addq.l #6,sp
.else
jbsr _malloc
addq.l #4,sp
.endif
movem.l (sp)+,d1-d2/a0-a2
tst.l d0
bmi NO_MEMORY
move.l d0,_buff_addr(a5)
move.l d0,a1
adda.l d1,a1
move.l a1,_buff_addr256(a5)
* âtâ@âCâïâoâbâtâ@é≡ò╩é╔èmò█üD
adda.l d1,a1
add.l d1,d1
add.l _src_fsize(a5),d1
move.l _buff_size(a5),d2
cmp.l d2,d1
bhi error * ümÅ¡âüâéâèé│éµéñé╚éτün
read_adr_get256_ex_all:
st.b _gif_hispeed(a5)
moveq.l #3,d6
move.l _src_fsize(a5),-(sp)
move.l a1,-(sp)
move.w _file(a5),-(sp)
DOS _READ
lea 10(sp),sp
tst.l d0
bmi error
add.l a1,d0
move.l d0,_enddata_addr(a5)
move.w _file(a5),-(sp)
DOS _CLOSE
addq.l #2,sp
rts
read_adr_get256_normal:
move.w _line(a5),d0
mulu.w _colum(a5),d0
addq.l #1,d0
and.w #$fffe,d0
move.l d0,_buff_req(a5)
add.l _src_fsize(a5),d0
movem.l d1-d2/a0-a2,-(sp)
move.l d0,-(sp)
move.l d0,_buff_size(a5)
.if 1
move.w #2,-(sp)
DOS _MALLOC2
addq.l #6,sp
.else
jbsr _malloc
addq.l #4,sp
.endif
movem.l (sp)+,d1-d2/a0-a2
tst.l d0
bmi NO_MEMORY
move.l d0,_buff_addr(a5)
move.l _buff_req(a5),d2
move.l d0,a1 * a1 ü` a1+d2 üü ë╝æzGRAM
move.l a1,_buff_addr256(a5)
adda.l d2,a1 * a1+d2 ü` üü âtâ@âCâïô╟é▌ì₧é▌
move.l _buff_size(a5),d1
cmp.l d1,d2
bhi error âüâéâèé¬æ½éΦé±
moveq.l #3,d6
move.l _src_fsize(a5),-(sp)
move.l a1,-(sp)
move.w _file(a5),-(sp)
DOS _READ
stopper:
lea 10(sp),sp
tst.l d0
bmi error
add.l a1,d0
move.l d0,_enddata_addr(a5)
move.w _file(a5),-(sp)
DOS _CLOSE
addq.l #2,sp
rts
* âIâèâWâiâïé╠ gif_load.hasüiâRâüâôâg by Mitsukyüj
.comment gif_comment */////////////////////////////////////////////////////////*
GIF decode routine for X680x0
original program v1.06 by Herzen
int gif_header_read()
ê°Éö
é╚é╡
û▀éΦÆl
0 É│ÅφÅIù╣
òëÉö âGâëü[
int gif_decode( short *buff )
ê°Éö
é╚é╡
û▀éΦÆl
0 É│ÅφÅIù╣
òëÉö âGâëü[
gif_comment *//////////////////////////////////////////////////////////////////*
gif_decode:
movem.l d3-d7/a3-a6,-(sp)
* movea.l a1,a6
* suba.l #FOR_PI256,a6
lea gifwork,a6
clr.w error_flag(a6)
movea.l _buff_addr256(a5),a4
move.l _buff_addr(a5),interlace_trans_addr(a6)
bsr expand
movem.l (sp)+,d3-d7/a3-a6
rts
*------------------------------------------------------------------------------*
gif_header_read:
movem.l d3-d7/a3-a6,-(sp)
lea gifwork,a6
bsr gif_header_read_
movem.l (sp)+,d3-d7/a3-a6
rts
gif_header_read_:
*------------------------------------------------------- üméféhéeÄ»ò╩ïLìåün
* GIF signature
* éUâoâCâgî┼ÆΦ
bsr getc
cmp.b #'G',d0
bne error_
bsr getc
cmp.b #'I',d0
bne error_
bsr getc
cmp.b #'F',d0
bne error_
bsr getc
cmp.b #'8',d0
bne error_
bsr getc
cmp.b #'7',d0 * 87
beq @f
cmp.b #'9',d0 * 89
bne error_
@@:
ext.w d0
move.w d0,gif_ver(a6)
bsr getc
cmp.b #'a',d0
bne error_
*------------------------------------------------------- ümâXâNâèü[âôÅεò±ün
* screen descriptor
* éVâoâCâgî┼ÆΦ
bsr getc * âXâNâèü[âôé╠ò¥
move.b d0,d1
bsr getc
lsl.w #8,d0
move.b d1,d0
move.w d0,sc_xsize(a6)
bsr getc * âXâNâèü[âôé╠ìéé│
move.b d0,d1
bsr getc
lsl.w #8,d0
move.b d1,d0
move.w d0,sc_ysize(a6)
moveq.l #0,d3
bsr getc
btst.l #7,d0 * âOâìü[âoâïâJâëü[â}âbâvé╠ùLû│
beq error_ * û│éóé╠é═Ä╫ô╣é╛
move.w d0,d1
lsr.w #4,d1 *
and.w #%111,d1 * ÉFë≡æ£ôxüicolor resolutionüj
addq.w #1,d1 * é╠ùLî°ârâbâgÉö
move.w d1,sc_cr(a6) *
and.w #%111,d0 * color pixel bit
addq.w #1,d0 *
move.w d0,sc_pixel(a6) * 1âsâNâZâïé╠bitÉö
bsr getc
and.w #$00ff,d0
* move.w d0,bg_col(a6) * öwîiÉF(not used)
bsr getc * âAâXâyâNâgüHüiÅ┌ì╫òsû╛üj
and.w #$00ff,d0
move.w d0,aspect(a6)
*------------------------------------------------------- ümâOâìü[âoâïâJâëü[â}âbâvün
* global color map
* éVâoâCâgî┼ÆΦ
move.w sc_pixel(a6),d0
bsr palet_get * âpâîâbâgĵô╛
move.w #0,animated_gif(a6)
*------------------------------------------------------- ümëµæ£Åεò±ün
* image descriptor
* 10âoâCâgî┼ÆΦüiâCâüü[âWò¬ùúïLìå è▄üj
* é╜é╛é╡üCègÆúâuâìâbâNÅ£é¡
to_img_sep_lop: * âCâüü[âWò¬ùúïLìåé▄é┼ö≥é╬é╖
bsr getc
cmp.b #IMAGE_SEPARATOR,d0
beq img_inf_get
cmp.b #TRAILER,d0
beq ERROR_DESTROY
cmp.b #EXT_INTRODUCER,d0
bne ERROR_EXT
bsr getc * ègÆúï@ö\ö╘ìå
cmp.b #$F9,d0
beq graphic_ctrl_ext
bsr getc * âuâìâbâNâTâCâY
ext_block_lop:
moveq.l #0,d1
move.b d0,d1
subq.w #1,d1
@@: bsr getc
dbra d1,@b
bsr getc
tst.b d0 * âuâìâbâNé╔æ▒é½é═éáéΘé⌐üH
bne ext_block_lop
bra to_img_sep_lop
graphic_ctrl_ext:
bsr getc * âuâìâbâNâTâCâY(=4)
bsr getc * Packed Flags
move.l d0,d1
bsr getc * Delay time
bsr getc *
bsr getc * Transparent Color Index
btst.l #0,d1 * ôºû╛âtâëâO
bne gce1
moveq.l #$ff,d0
gce1:
move.w d0,_tpcolor(a5) * ôºû╛ÉF
bsr getc * Block Terminator
bra to_img_sep_lop
img_inf_get:
bsr getc * ì╢Åπéwì└òWüiëµæ£é╠éwê╩Æuüj
move.b d0,d1
bsr getc
lsl.w #8,d0
move.b d1,d0
move.w d0,_scolum(a5)
bsr getc * ì╢Åπéxì└òWüiëµæ£é╠éxê╩Æuüj
move.b d0,d1
bsr getc
lsl.w #8,d0
move.b d1,d0
move.w d0,_sline(a5)
bsr getc * ëµæ£é╠ò¥
move.b d0,d1
bsr getc
lsl.w #8,d0
move.b d1,d0
move.w d0,_colum(a5)
bsr getc * ëµæ£é╠ìéé│
move.b d0,d1
bsr getc
lsl.w #8,d0
move.b d1,d0
move.w d0,_line(a5)
moveq.l #31,d6
bsr getc * âìü[âJâïâJâëü[â}âbâvüCâCâôâ^ü[âîâXüCÉFë≡æ£ôx
clr.b _gif_hispeed+1(a5)
btst.l #6,d0 * Interlaceé⌐üH
sne.b _gif_hispeed+1(a5)
btst.l #7,d0 * âìü[âJâïâJâëü[â}âbâvé≡ùpéóéΘé⌐üH
beq @f
and.w #%111,d0
addq.w #1,d0 * 1âsâNâZâïéáé╜éΦé╠bitÉö
bsr palet_get * ì─ôxĵô╛
@@:
*------------------------------------------------------- ümâëâXâ^ü[âfü[â^ün
* Raster data
bsr getc * pixel_bit
and.w #$ff,d0
move.w d0,img_CodeSize(a6)
move.w #8,_color(a5) * 256ÉF
cmp.w #4,d0
bhi @f
move.w #4,_color(a5) * 16ÉF
@@:
moveq.l #1,d1
lsl.w d0,d1
ext.l d1
subq.l #1,d1
move.l d1,img_BitMask(a6)
move.w _scolum(a5),d0
add.w _colum(a5),d0
subq.w #1,d0
move.w d0,_ecolum(a5)
move.w _sline(a5),d0
add.w _line(a5),d0
subq.w #1,d0
move.w d0,_eline(a5)
moveq.l #0,d0
rts
error_:
moveq.l #-1,d0
rts
*------------------------------------------------------------------------------
*
palet_get:
moveq.l #1,d2
lsl.w d0,d2
subq.w #1,d2
lea.l _pal_buf(a5),a0
palet_loop:
bsr getc * R
and.w #$00f8,d0
rol.w #3,d0
move.w d0,d1
bsr getc * G
and.w #$00f8,d0
ror.w #8,d0
or.w d0,d1
bsr getc * B
and.w #$00f8,d0
ror.w #2,d0
or.w d0,d1
move.w d1,(a0)+
@@: dbra d2,palet_loop
rts
*------------------------------------------------------------------------------
*
* âfâRü[âhòöâüâCâô
*
* GIF's LZW ôWèJâïü[â`âô
*
expand:
move.l a4,vgram(a6)
move.w _colum(a5),d0
mulu.w _line(a5),d0
addq.l #1,d0
and.w #$fffe,d0
move.l a4,d1
add.l d1,d0
move.l d0,chk_addr(a6) * ë╝æzGRAMé╠ì┼ÅIâAâhâîâX
moveq.l #0,d3
move.l d3,d4
move.l d3,d5
move.l d3,d7
move.l img_BitMask(a6),d0
move.w d0,BitMask(a6)
move.w d0,d5
swap.w d5
move.w d3,Interlace(a6)
tst.b _gif_hispeed+1(a5)
sne.b Interlace+1(a6)
moveq.l #1,d6 * PreLen
swap.w d6 * PreLen ü¿ CodeSize
move.w img_CodeSize(a6),d6 * d6.w = CodeSize
moveq.l #1,d1
lsl.w d6,d1
move.w d1,ClearCode(a6)
addq.w #1,d1
move.w d1,d2 * d2.w = EOFCode
move.w d1,EOFCode(a6)
addq.w #1,d1
move.w d1,d7 * d7.w = FreeCode
move.w d1,FirstFree(a6)
addq.w #1,d6
move.w d6,InitCodeSize(a6)
moveq.l #1,d1
lsl.w d6,d1
swap.w d2
move.w d1,d2 * MaxCode
move.w d1,InitMaxCode(a6)
subq.w #1,d1
move.w d1,d5 * d5.w = ReadMask
move.w d1,InitReadMask(a6)
movea.l a1,a3 * a3 = RasterData
bsr RasterGet * âëâXâ^âfü[â^é≡ĵô╛üD
move.l a5,-(sp)
lea.l Length(a6),a5
move.w d7,d0
add.w d0,d0
lea.l (a5,d0.w),a1 * Åæé½ì₧é▌ÉΩùp
move.l a1,restore_addrs(a6)
add.w d0,d0
lea.l (a6,d0.w),a2 * Åæé½ì₧é▌ÉΩùp
move.l a2,restore_addrs+4(a6)
* - decode start!!
while_lop:
readCode
cmp.w EOFCode(a6),d1
beq while_end
cmp.w ClearCode(a6),d1
bne if1_else
moveq.l #1,d6
swap.w d6
move.w InitCodeSize(a6),d6
move.w InitMaxCode(a6),d2
move.w InitReadMask(a6),d5
move.w FirstFree(a6),d7
readCode
movea.l restore_addrs(a6),a1
movea.l restore_addrs+4(a6),a2
move.b d1,(a4)+
bra while_lop
if1_else:
cmp.l chk_addr(a6),a4
bhi while_end
swap.w d5 * ReadMask ü¿ BitMask
swap.w d3 * readCodeSize ü¿ FinChar
swap.w d6 * EOFCode ü¿ OldCode
cmp.w d7,d1 * CurCode >= FreeCode
bcs next01
move.w d6,d0
movea.l a4,a0
suba.w d0,a0
addq.w #1,d6
cmp.w #4095,d7
bhi @f
move.w d6,(a1)+
move.l a0,(a2)+
@@: move.b (a0)+,(a4)+
dbra d0,@b
bra if1_else_cont
next01:
cmp.w d5,d1
bls next02
move.w d1,d0
add.w d0,d0
move.w (a5,d0.w),d3 * ìíë±
add.w d0,d0
movea.l (a6,d0.w),a0
cmp.w #4095,d7
bhi @f
move.l a4,d0
move.w d6,d1 * æOë±é╠Æ╖é│
ext.l d1
sub.l d1,d0
move.l d0,(a2)+
addq.w #1,d1
move.w d1,(a1)+
@@:
move.w d3,d6
subq.w #1,d3
@@: move.b (a0)+,(a4)+
dbra d3,@b
bra if1_else_cont
next02:
move.w d1,d3
cmp.w #4095,d7
bhi @f
move.l a4,d0
move.w d6,d1 * æOë±é╠Æ╖é│
ext.l d1
sub.l d1,d0
move.l d0,(a2)+
addq.w #1,d1
move.w d1,(a1)+
@@:
move.w #1,d6
move.b d3,(a4)+
* bra if1_else_cont
if1_else_cont:
addq.w #1,d7 * FreeCode
swap.w d5 * BitMask ü¿ ReadMask
swap.w d3 * FinChar ü¿ readCodeSize
swap.w d6 * OldCode ü¿ EOFCode
cmp.w d2,d7 * MaxCode, FreeCode
bcs while_lop
cmp.w #12,d6
bcc while_lop
addq.w #1,d6
add.w d2,d2
moveq.l #1,d1
lsl.w d6,d1
subq.w #1,d1
move.w d1,d5 * ReadMask
@@:
endif1:
bra while_lop
while_end:
move.l (sp)+,a5
tst.w Interlace(a6)
bne to_interlace
moveq.l #0,d0
rts
*------------------------------------------------------------------------------
*
* âCâôâ^ü[âîâXò╧è╖
*
to_interlace:
movea.l interlace_trans_addr(a6),a4 * ò╧è╖ɵ
movea.l vgram(a6),a3 * ò╧è╖î│
moveq.l #0,d3
moveq.l #0,d2
move.w _line(a5),d2
swap.w d2
moveq.l #0,d0
move.l d0,d1
move.w _colum(a5),d0
move.w d0,d1
lsl.l #3,d0 * 8ö{
sub.l d1,d0
move.l d0,colum8(a6)
moveq.l #0,d0
move.w d1,d0
lsl.l #2,d0 * 4ö{
sub.l d1,d0
move.l d0,colum4(a6)
move.w _line(a5),d1
subq.w #1,d1
@@:
bsr timatima
bsr address_chg
dbra d1,@b
moveq.l #0,d0
rts
address_chg:
move.w d2,d0
add.w d0,d0
jmp pass_tbl_(pc,d0.w)
rts
pass_tbl_:
bra.s pass0_
bra.s pass1_
bra.s pass2_
bra.s pass3_
pass0_:
swap.w d2
addq.w #8,d3
cmp.w d3,d2
bhi.b @f
swap.w d2
addq.w #1,d2
move.w #4,d3
moveq.l #0,d0
move.w _colum(a5),d0
lsl.l #2,d0 * éSö{
movea.l interlace_trans_addr(a6),a4
adda.l d0,a4
rts
@@:
swap.w d2
adda.l colum8(a6),a4
rts
pass1_:
swap.w d2
addq.w #8,d3
cmp.w d3,d2
bhi.b @f
swap.w d2
addq.w #1,d2
move.w #2,d3
moveq.l #0,d0
move.w _colum(a5),d0
lsl.l #1,d0 * éQö{
movea.l interlace_trans_addr(a6),a4
adda.l d0,a4
rts
@@:
swap.w d2
adda.l colum8(a6),a4
rts
pass3_:
addq.w #2,d3
adda.w _colum(a5),a4
rts
pass2_:
swap.w d2
addq.w #4,d3
cmp.w d3,d2
bhi.b @f
swap.w d2
addq.w #1,d2
move.w #1,d3
movea.l interlace_trans_addr(a6),a4
adda.w _colum(a5),a4
rts
@@:
swap.w d2
adda.l colum4(a6),a4
rts
timatima:
move.w _colum(a5),d0
@@:
sub.w #256,d0
bmi @f
bsr tima
bra @b
@@:
add.w #256,d0
move.w #256,d4
sub.w d0,d4
add.w d4,d4
jmp tima(pc,d4.w)
nop
tima:
.rept 256
move.b (a3)+,(a4)+ * 030ê╚ì~é╠Élé╔é╞é┴é─é═ânâ^û└ÿfé╚âïü[âvôWèJ :-)
.endm
rts
*------------------------------------------------------------------------------
*
* âëâXâ^ü[âfü[â^ĵô╛
*
RasterGet:
movea.l a1,a0
rc_lop:
moveq.l #0,d0
move.b (a1)+,d0
beq RasterCopy_end
cmp.l _enddata_addr(a5),a1
bhi ERROR_DESTROY
cmp.w #$fe,d0
beq rc_t
subq.w #1,d0
@@: move.b (a1)+,(a0)+
dbra d0,@b
bra rc_lop
RasterCopy_end:
move.l a1,next_readdata_addr(a6)
rts
rc_t:
.rept 254
move.b (a1)+,(a0)+ * û{ôûé═é▒é▒é▄é┼é╖éΘòKùvé═é╚éóé╠é⌐éα :-)
.endm
bra rc_lop
*------------------------------------------------------------------------------
*
* ëµæ£ôWèJîπüCé│éτé╔âfü[â^é¬éáéΘé⌐é╟éñé⌐üH
*
* éáéΘé⌐é╟éñé⌐ÆméΘé╛é»é┼üCé│éτé╔ôWèJé╖éΘïCé═é╚éó :-)
*
next_data_chk:
movea.l next_readdata_addr(a6),a1
next_data_chk_lop:
cmp.l _enddata_addr(a5),a1
bhi ÅIÆ[ïLìåé¬é╚éó
move.b (a1)+,d0
cmp.b #TRAILER,d0
beq âfü[â^ÅIéφéΦ
cmp.b #IMAGE_SEPARATOR,d0
beq next_data
cmp.b #EXT_INTRODUCER,d0
bne ERROR_EXT
@@:
addq.l #1,a1 * ï@ö\ö╘ìåé═é╞é╬é╖üD
moveq.l #0,d0
move.b (a1)+,d0 * âfü[â^âTâCâY
@@: adda.w d0,a1
move.b (a1)+,d0 * âfü[â^âTâCâYüC0 é╛é┴é╜éτÅIù╣
bne @b
bra next_data_chk_lop
âfü[â^ÅIéφéΦ
rts
next_data:
addq.w #1,animated_gif(a0) * No.?? ûçû┌é╠GIFé¬æ╢ì▌é╖éΘüD
rts
*------------------------------------------------------------------------------
*
* misc.
*
getc:
move.w _file(a5),-(sp)
.dc.w $ff1b * __GETC
addq.l #2,sp
tst.l d0
bmi ERROR_LOAD
rts
* ÄΦö▓é½é╠ï╔Æn :-)
ERROR_EXT:
ERROR_DESTROY:
ERROR_LOAD:
ÅIÆ[ïLìåé¬é╚éó:
moveq.l #-1,d0
rts
.bss
gifwork:
ds.b __gifworkend
.end